import 主程序子程序结构.demo1;
import 管道过滤软件结构.*;
import 观察者类.KWICSubject;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        String inputfile = "src/input.txt";
        String filePath = "src/output.txt";



        System.out.println("默认选择文件 input.txt");
        System.out.println("input.txt内容如下");
        readTxt(inputfile);
        System.out.println();
        System.out.println("请输入数字选择您要选择的方式");
        System.out.println("1代表主程序-子程序软件体系结构\n" +
                "2代表管道过滤软件体系结构\n" +
                "3代表观察者类软件体系结构\n" +
                "4代表面向对象软件体系结构\n");

        int type = sc.nextInt();
        //1代表主程序-子程序软件体系结构
        if (type==1){
            demo1 kwic = new demo1();
            kwic.input(inputfile);
            kwic.shift();
            kwic.alphabetizer();
            kwic.output(filePath);

            System.out.println("主程序： 是程序的主要模块或入口点。它通常是程序中最先执行的部分，负责协调整个程序的执行。");
            System.out.println("子程序： 也称为函数或过程，是一组指令，旨在执行程序内频繁使用的操作。它是一个自包含的代码单元，可以从主程序或其他子程序中调用（调用）。");
        }
        //2代表管道过滤软件体系结构
        else if(type==2){
            File inFile = new File(inputfile);
            File outFile = new File(filePath);
            Pipe pipe1 = new Pipe();
            Pipe pipe2 = new Pipe();
            Pipe pipe3 = new Pipe();
            Input input = new Input(inFile, pipe1);
            Shift shift = new Shift(pipe1, pipe2);
            Alphabetizer alphabetizer  = new Alphabetizer(pipe2, pipe3);
            Output output = new Output(outFile,pipe3);
            input.transform();
            shift.transform();
            alphabetizer.transform();
            output.transform();

            System.out.println("管道-过滤软件体系结构： 是一种软件体系结构，其中数据通过一系列称为过滤器的组件进行处理，这些过滤器排列成管道。每个过滤器对数据执行特定的操作，并将其传递给下一个过滤器。过滤器管道共同转换输入数据。这种架构促进了模块化和可重用性，因为每个过滤器都可以独立开发，并结合以实现各种处理任务。");
        }
        //3代表观察者类软件体系结构
        else if(type==3){
            //创建主题
            KWICSubject kwicSubject = new KWICSubject();
            //创建观察者
            观察者类.Input input = new 观察者类.Input(inputfile);
            观察者类.Shift shift = new 观察者类.Shift(input.getLineTxt());
            观察者类.Alphabetizer alphabetizer = new 观察者类.Alphabetizer(shift.getKwicList());
            观察者类.Output output = new 观察者类.Output(alphabetizer.getKwicList(), filePath);

            // 将观察者加入主题
            kwicSubject.addObserver(input);
            kwicSubject.addObserver(shift);
            kwicSubject.addObserver(alphabetizer);
            kwicSubject.addObserver(output);
            // 逐步调用各个观察者
            kwicSubject.startKWIC();

            System.out.println("事件系统： 在软件开发中，事件系统是管理和响应事件的机制，其中事件是系统内的发生或发生的事情。事件可以是用户操作、传感器输入或其他信号。事件系统通常包括用于事件生成、检测和处理的组件。");
        }
        //4代表面向对象软件体系结构
        else {
            面向对象结构.Input input = new 面向对象结构.Input();
            input.input(inputfile);
            面向对象结构.Shift shift = new 面向对象结构.Shift(input.getLineTxt());
            shift.shift();
            面向对象结构.Alphabetizer alphabetizer = new 面向对象结构.Alphabetizer(shift.getKwicList());
            alphabetizer.sort();
            面向对象结构.Output output = new 面向对象结构.Output(alphabetizer.getKwicList());
            output.output(filePath);

            System.out.println("面向对象： 是一种编程范式，它使用对象（类的实例）来组织和结构化代码。对象封装了数据和行为，它们通过明确定义的接口相互交互。面向对象编程的关键原则包括封装、继承和多态性。");
        }

        System.out.println();
        System.out.println("文件处理结果");
        readTxt(filePath);

    }
    public static void readTxt(String filePath){

        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                // 将每一行内容打印在控制台上
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}
